package com.study.mybatis.util;

import org.apache.ibatis.session.SqlSession;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;


public class TransactionInvocationHandler implements InvocationHandler {

    //target:zs
    private Object target;

    public TransactionInvocationHandler(Object target){

        this.target = target;

    }

    //代理类的业务方法
    //ls的表白方法
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

        SqlSession session = null;
        Object obj = null;

        try{

            session = SqlSessionUtil.getSession();

            //处理业务逻辑
            //method.invoke：zs的表白方法
            obj = method.invoke(target, args);

            //处理业务逻辑完毕后，提交事务
            session.commit();

        }catch(Exception e){

            session.rollback();

            e.printStackTrace();
        }finally {
            SqlSessionUtil.myClose(session);
        }

        return obj;
    }

    //取得ls对象
    public Object getProxy(){
        // ClassLoader: 类加载器，用于加载生成的代理类。
        // Interfaces: 被代理对象所实现的接口数组，指定代理类要实现的接口。
        // InvocationHandler: 一个实现了 InvocationHandler 接口的对象，用于处理代理对象的方法调用。
        return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
/*
this 关键字作为 InvocationHandler 实现类的实例传递给 Proxy.newProxyInstance 方法。
这意味着当前类（或当前方法所在的类）充当了代理对象的调用处理器，负责处理代理对象上的方法调用。
Proxy.newProxyInstance方法返回一个代理对象，该对象实现了指定的接口，并且在方法调用时会委托给我们提供的 InvocationHandler 实现类来处理方法的调用。
注意：在使用动态代理时，被代理类必须实现接口，因为 Java 的动态代理是基于接口的。如果被代理类没有实现接口，可以考虑使用其他技术，如 CGLIB。
*/
    }

}





































